package main

import (
	"encoding/json"
	"fmt"
	"time"
)

type Person struct {
	Name       string                      `json:"name"`
	Age        int32                       `json:"-"`         // 忽略此字段,不是下划线，是横杠
	ID         int64                       `json:"id,string"` // 表明此fields对应json串中的类型是 string
	Height     int32                       `json:"height"`
	Email      string                      `json:"email,omitempty"` // 如果此字段对应的值为 空值，则忽略此字段
	Profile1                               // 如果不定义 tag, 序列化后此匿名嵌套 为 单层
	Profile2   `json:"profile2"'`          // 此 为 nest 显示
	*Profile3  `json:"profile3,omitempty"` // 如果忽略序列化 空值，除了 tag 是 omitempty，此匿名嵌套还需要是指针类型
	CreateTime time.Time                   `json:"create_time"`
}

type Profile1 struct {
	Website string `json:"website"`
}

type Profile2 struct {
	Website string `json:"website"`
}

type Profile3 struct {
	Website string `json:"website"`
}

func main() {

	p1 := Person{
		Name:   "111",
		Age:    1000,
		ID:     8888888,
		Height: 180,
		Profile1: Profile1{
			Website: "www.baidu.com",
		},
		Profile2: Profile2{
			Website: "www.taobao.com",
		},
	}

	b, _ := json.Marshal(p1)
	fmt.Printf("%s\n", b) //
	var p2 Person
	_ = json.Unmarshal(b, &p2) // 反序列化
	fmt.Printf("%T\n", p2.Height)

}
